/**
 * 日期处理工具模块
 * @module dateUtils
 * @author 3Clear_LZ
 * @version 1.0.3
 */
module.exports = {
  /**
   * @description 判断闰年
   * @param {Date} Date日期对象
   * @return {Boolean} true 或false
   */
  isLeapYear: function(date) {
    return date.getYear() % 4 === 0 && (date.getYear() % 100 !== 0 || date.getYear() % 400 === 0);
  },
  /**
   * @description 日期对象转换为指定格式的字符串
   * @param {String} formatStr 日期格式,格式定义如下 yyyy-MM-dd HH:mm:ss
   * @param {Date} date Date日期对象, 如果缺省，则为当前时间，
   * YYYY/yyyy/YY/yy 表示年份,
   * MM/M 月份,
   * W/w 星期,
   * dd/DD/d/D 日期,
   * hh/HH/h/H 时间,
   * mm/m 分钟,
   * ss/SS/s/S 秒,
   * @return {String} 指定格式的时间字符串
   */
  dateToStr: function(formatStr = 'yyyy-MM-dd HH:mm:ss', date = new Date()) {
    let str = formatStr;
    let Week = ['日', '一', '二', '三', '四', '五', '六'];
    str = str.replace(/yyyy|YYYY/, date.getFullYear());
    str = str.replace(
      /yy|YY/,
      date.getYear() % 100 > 9 ? (date.getYear() % 100).toString() : '0' + (date.getYear() % 100)
    );
    str = str.replace(/MM/, date.getMonth() >= 9 ? date.getMonth() + 1 : '0' + (date.getMonth() + 1));
    str = str.replace(/M/g, date.getMonth());
    str = str.replace(/w|W/g, Week[date.getDay()]);

    str = str.replace(/dd|DD/, date.getDate() > 9 ? date.getDate().toString() : '0' + date.getDate());
    str = str.replace(/d|D/g, date.getDate());

    str = str.replace(/hh|HH/, date.getHours() > 9 ? date.getHours().toString() : '0' + date.getHours());
    str = str.replace(/h|H/g, date.getHours());
    str = str.replace(/mm/, date.getMinutes() > 9 ? date.getMinutes().toString() : '0' + date.getMinutes());
    str = str.replace(/m/g, date.getMinutes());

    str = str.replace(/ss|SS/, date.getSeconds() > 9 ? date.getSeconds().toString() : '0' + date.getSeconds());
    str = str.replace(/s|S/g, date.getSeconds());

    return str;
  },
  /**
   * @description 日期计算
   * @param {String} strInterval  可选值 y 年 m月 d日 w星期 ww周 h时 n分 s秒
   * @param {Number} num 计算步长
   * @param {Date} Date 日期对象
   * @return {Date} 返回日期对象
   */
  dateAdd: function(strInterval, num, date = new Date()) {
    let newDate = new Date();
    switch (strInterval) {
      case 's':
        newDate = new Date(date.getTime() + 1000 * num);
        break;
      case 'n':
        newDate = new Date(date.getTime() + 60000 * num);
        break;
      case 'h':
        newDate = new Date(date.getTime() + 3600000 * num);
        break;
      case 'd':
        newDate = new Date(date.getTime() + 86400000 * num);
        break;
      case 'w':
        newDate = new Date(date.getTime() + 86400000 * 7 * num);
        break;
      case 'm':
        newDate = new Date(
          date.getFullYear(),
          date.getMonth() + num,
          date.getDate(),
          date.getHours(),
          date.getMinutes(),
          date.getSeconds()
        );
        break;
      case 'y':
        newDate = new Date(
          date.getFullYear() + num,
          date.getMonth(),
          date.getDate(),
          date.getHours(),
          date.getMinutes(),
          date.getSeconds()
        );
        break;
      default:
        break;
    }
    return newDate;
  },
  /**
   * @description 比较日期差 dtEnd 格式为日期型或者有效日期格式字符串
   * @param {String} strInterval  可选值 y 年 m月 d日 w星期 ww周 h时 n分 s秒
   * @param  {Date} dtStart   可选值 y 年 m月 d日 w星期 ww周 h时 n分 s秒
   * @param {Date} dtEnd  可选值 y 年 m月 d日 w星期 ww周 h时 n分 s秒
   * @returns {Number} 日期差
   */
  dateDiff: function(strInterval, dtStart, dtEnd) {
    let diff = 0;
    switch (strInterval) {
      case 's':
        diff = parseInt((dtEnd - dtStart) / 1000);
        break;
      case 'n':
        dtStart = new Date(
          dtStart.getFullYear(),
          dtStart.getMonth(),
          dtStart.getDate(),
          dtStart.getHours(),
          dtStart.getMinutes(),
          0
        );
        dtEnd = new Date(
          dtEnd.getFullYear(),
          dtEnd.getMonth(),
          dtEnd.getDate(),
          dtEnd.getHours(),
          dtEnd.getMinutes(),
          0
        );
        diff = parseInt((dtEnd - dtStart) / 60000);
        break;
      case 'h':
        dtStart = new Date(dtStart.getFullYear(), dtStart.getMonth(), dtStart.getDate(), dtStart.getHours(), 0, 0);
        dtEnd = new Date(dtEnd.getFullYear(), dtEnd.getMonth(), dtEnd.getDate(), dtEnd.getHours(), 0, 0);
        diff = parseInt((dtEnd - dtStart) / 3600000);
        break;
      case 'd':
        dtStart = new Date(dtStart.getFullYear(), dtStart.getMonth(), dtStart.getDate(), 0, 0, 0);
        dtEnd = new Date(dtEnd.getFullYear(), dtEnd.getMonth(), dtEnd.getDate(), 0, 0, 0);
        diff = parseInt((dtEnd - dtStart) / 86400000);
        break;
      case 'w':
        diff = parseInt((dtEnd - dtStart) / (86400000 * 7));
        break;
      case 'm':
        dtStart = new Date(dtStart.getFullYear(), dtStart.getMonth(), 0, 0, 0, 0);
        dtEnd = new Date(dtEnd.getFullYear(), dtEnd.getMonth(), 0, 0, 0, 0);
        diff = dtEnd.getMonth() + 1 + (dtEnd.getFullYear() - dtStart.getFullYear()) * 12 - (dtStart.getMonth() + 1);
        break;
      case 'y':
        diff = dtEnd.getFullYear() - dtStart.getFullYear();
        break;
      default:
        break;
    }
    return diff;
  },
  /**
   * @description 字符串转换为日期对象
   * @param {Date} dateStr 格式为yyyy-MM-dd HH:mm:ss，必须按年月日时分秒的顺序，中间分隔符不限制
   * @returns {Date} 期对象
   */
  strToDate: function(dateStr) {
    // var data = dateStr;
    // var reCat = /(\d{1,4})/gm;
    // var t = data.match(reCat);
    // t[1] = t[1] - 1;
    // eval('var d = new Date(' + t.join(',') + ');');
    // return d;

    var strArray = dateStr.split(' ');
    var strDate = strArray[0].split('-');
    var strTime = strArray[1].split(':');
    return new Date(strDate[0], strDate[1] - parseInt(1), strDate[2], strTime[0], strTime[1], strTime[2]);
  },
  /**
   * @description 把指定格式的字符串转换为日期对象yyyy-MM-dd HH:mm:ss
   * @param {String} formatStr 格式
   * @param {String}  dateStr  日期字符串
   * @returns {Date} 日期对象
   */
  strFormatToDate: function(formatStr, dateStr) {
    var year = 0;
    var start = -1;
    var len = dateStr.length;
    if ((start = formatStr.indexOf('yyyy')) > -1 && start < len) {
      year = dateStr.substr(start, 4);
    }
    var month = 0;
    if ((start = formatStr.indexOf('MM')) > -1 && start < len) {
      month = parseInt(dateStr.substr(start, 2)) - 1;
    }
    var day = 0;
    if ((start = formatStr.indexOf('dd')) > -1 && start < len) {
      day = parseInt(dateStr.substr(start, 2));
    }
    var hour = 0;
    if (((start = formatStr.indexOf('HH')) > -1 || (start = formatStr.indexOf('hh')) > 1) && start < len) {
      hour = parseInt(dateStr.substr(start, 2));
    }
    var minute = 0;
    if ((start = formatStr.indexOf('mm')) > -1 && start < len) {
      minute = dateStr.substr(start, 2);
    }
    var second = 0;
    if ((start = formatStr.indexOf('ss')) > -1 && start < len) {
      second = dateStr.substr(start, 2);
    }
    return new Date(year, month, day, hour, minute, second);
  },
  /**
   * @description 日期对象转换为毫秒数
   * @param {Date} date 日期对象
   * @returns {Number} 毫秒数
   */
  dateToLong: function(date) {
    return date.getTime();
  },
  /**
   * @description 毫秒转换为日期对象
   * @param {Number} dateVal 日期的毫秒数
   * @returns {Date} 日期对象
   */
  longToDate: function(dateVal) {
    return new Date(dateVal);
  },
  /**
   * @description 获取某月的的最大一天
   * @param {Number} year  年
   * @param {NUmber} month  月
   * @returns {String} 如31
   */
  getMaxDay: function(year, month) {
    if (month === 4 || month === 6 || month === 9 || month === 11) {
      return '30';
    } else if (month === 2) {
      if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
        return '29';
      } else {
        return '28';
      }
    } else {
      return '31';
    }
  },
  /**
   * @description 变量是否为数字
   * @param {String} str 数字字符串
   * @returns {Boolean} true or false
   */
  isNumber: function(str) {
    var regExp = /^\d+$/g;
    return regExp.test(str);
  },
  /**
   * @description 把日期分割成数组 [年、月、日、时、分、秒]
   * @param {Date} myDate 日期对象
   * @returns {Array} [年、月、日、时、分、秒]
   */
  toArray: function(myDate = new Date()) {
    let myArray = [];
    myArray[0] = myDate.getFullYear();
    myArray[1] = myDate.getMonth();
    myArray[2] = myDate.getDate();
    myArray[3] = myDate.getHours();
    myArray[4] = myDate.getMinutes();
    myArray[5] = myDate.getSeconds();
    return myArray;
  },

  /**
   * @description 取得日期数据信息
   * @param {String} interval 表示数据类型
   * @param {Date} myDate 日期对象
   * @returns {*}  y 年, M月, d日, w星期, ww周, h时, n分, s秒
   */
  datePart: function(interval, myDate = new Date()) {
    var partStr = '';
    var Week = ['日', '一', '二', '三', '四', '五', '六'];
    switch (interval) {
      case 'y':
        partStr = myDate.getFullYear();
        break;
      case 'M':
        partStr = myDate.getMonth() + 1;
        break;
      case 'd':
        partStr = myDate.getDate();
        break;
      case 'w':
        partStr = Week[myDate.getDay()];
        break;
      case 'ww':
        partStr = myDate.WeekNumOfYear();
        break;
      case 'h':
        partStr = myDate.getHours();
        break;
      case 'm':
        partStr = myDate.getMinutes();
        break;
      case 's':
        partStr = myDate.getSeconds();
        break;
      default:
        break;
    }
    return partStr;
  },
  /**
   * @description 取得当前日期所在月的最大天数
   * @param {Date} date 日期对象
   * @returns {Number} 最大天数
   */
  maxDayOfDate: function(date = new Date()) {
    date.setDate(1);
    date.setMonth(date.getMonth() + 1);
    var time = date.getTime() - 24 * 60 * 60 * 1000;
    var newDate = new Date(time);
    return newDate.getDate();
  },
};
